package com.lesama.polymorphism;

/*
* 多态关系下父类引用访问成员的特点
* 1.访问成员变量： 编译看左边（父类），运行看左边（父类）
* 2.访问成员方法： 编译看左边（父类），运行看右边（子类）
* 在编译的时候会检查父类中是否有对应的方法，若没有，则报错，但调用的时候会调用子类中的方法，因为担心调用的父类方法是个抽象方法，没有意义
* 3.多态创建对象调用静态成员时：静态的成员在使用对象进行调用时，实际上是一种假象
* 在生成的字节码文件中会转换为类名进行调用，因此调用的静态成员是父类的静态成员
* 注意：多态创建的对象是不能访问子类特有的成员的，
* 这是因为子类特有的成员，若是成员变量，由于编译时检测到父类中没有，则编译报错，成员方法同理
* 另外多态要求成员方法必须重写，而子类特有的方法父类是没有的，因此无法调用
* */

public class PolymorphismDemo2 {
    public static void main(String[] args) {
        Fu fu = new Zi();
        System.out.println(fu.num);
        fu.print();
        System.out.println(fu.str);
        fu.method();
    }
}

class Fu {
    int num = 10;
    static String str = "Fu";
    void print() {
        System.out.println("Fu...print");
    }
    static void method() {
        System.out.println("Fu...method");
    }
}

class Zi extends Fu {
    int num = 20;
    static String str = "Zi";
    @Override
    void print() {
        System.out.println("Zi...print");
    }
    static void method() {
        System.out.println("Zi...method");
    }
}